#include "hspdsc.as" // Windows XP 以上のOSで実行する必要があります。 title "DirectShow キャプチャデバイス表示 ビデオミキシング" cls 4 dsc_Init // 初期化 // デバイスリスト用の変数を初期化 sdim devname, dsc_GetDeviceListSize() // デバイスリストを変数に格納 dsc_GetDeviceList devname, 0 if stat == 0 || stat == -2 : dialog "デバイスが見つかりません" : end objsize 300, 20 combox id, 100, devname objsize 150,20 button "デバイスを再生",*play button "デバイスを停止",*_stop button "プロパティを表示",*prop button "解像度プロパティを表示",*prop2 button "プロパティ表示(自前)",*prop3 button "キャプチャして表示",*capture button "BMPで保存して表示",*savebmp button "終了する",*exit stop *play // 再生処理 dsc_SetActiveSel 0 dsc_Open id, 1, 0, 1, 1 if stat < 0 : dialog "エラーが発生しました。",1,"DEVICE-ERROR" : stop gsel 0, 1 dsc_Play hwnd, 160, 120, 320, 240 if stat < 0 : dialog "エラーが発生しました。",1,"CAPTURE-ERROR" : stop // ビデオミキシング w = dsc_CapW h = dsc_CapH // ビデオのサイズが0以下だった場合 if w <= 0 || h <= 0 : dialog "サイズ取得エラー" : stop // 画像読み取り用のウィンドウを作成 // buffer では HDCが取れないので必ず screen を使用してください。 // 非表示モードで作成すれば大概の用途では問題ないはずです。 screen 2, w, h, 2 color 0, 0, 255 : boxf pos w-80, 0 picload "hsplogo.bmp", 1 // 青色(0,0,255)がすけるようになります。 // スケスケHSPのロゴが右上に表示されます。 dsc_VMRMixImage hdc, 0, 0, w, h, 0.3f, 0.0f, 0.0f, 1.0f, 1.0f, 1, 0, 0, 255 if stat < 0 : dialog "ミキシング失敗", 1, "MIXING-ERROR" : stop gsel 0, 1 stop *_stop // 停止&クローズ dsc_Stop dsc_Close stop *prop // 再生中でないと失敗します。 dsc_FilterProp hwnd, "Device Filter" stop *prop2 // dsc_playを使う前でないとうまく実行できない為、再生中の場合は一度リセットする。 dsc_Stop dsc_Close // クローズする dsc_Open id, 1, 0, 1, 1 // 再度オープン gsel 0, 1 dsc_DevPinProp hwnd // ここでプロパティを表示 dsc_Play hwnd, 160, 120, 320, 240 // 再び再生 stop *capture // サイズ取得 w = dsc_CapW h = dsc_CapH // ビデオのサイズが0以下だった場合 if w <= 0 || h <= 0 : dialog "サイズ取得エラー" : stop screen 1, w, h dsc_GetImage hdc, 0, 0, w, h redraw 1 // これは必ず必要 gsel 0, 1 stop *savebmp dsc_SaveBMP "test.bmp" wait 5 // ちょっと待たせたほうがいいかも exist "test.bmp" if strsize != -1{ screen 1, 32, 32 picload "test.bmp" gsel 0,1 } stop *exit dsc_Stop dsc_Close end *prop3 // サイズとFourCCを取得します dialog "サイズ:"+dsc_CapW+"x"+dsc_CapH+"\nFourCC:"+dsc_FourCC+"\n"+strf("%2.2ffps",double((1.0 * 10 * 1000 * 1000) / dsc_AvgFrame)) stop